package cn.yx.common.core.util.date;

import cn.yx.common.core.enums.date.DatePatternEnum;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * <p>日期时间解析工具类</p>
 *
 * @author Wgssmart
 */
public final class DateParseUtil {

    private DateParseUtil() {
    }

    /**
     * 把时间字符串按照默认时间格式解析成Date实例
     *
     * @param dateStr 时间字符串
     * @return 通过默认的时间格式解析成的Date实例
     */
    public static Date parseDatetime(String dateStr) {
        return parseDatetime(dateStr, DatePatternEnum.DATETIME.getValue());
    }

    /**
     * 把时间字符串按照指定时间格式解析成Date实例
     *
     * @param dateStr 时间字符串
     * @param pattern 时间格式
     * @return 通过指定时间格式解析成的Date实例
     */
    public static Date parseDatetime(String dateStr, String pattern) {
        return DateUtil.date(LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern)));
    }

    /**
     * 把日期字符串按照默认时间格式解析成Date实例
     *
     * @param dateStr 时间字符串
     * @return 通过默认的时间格式解析成的Date实例
     */
    public static Date parseDate(String dateStr) {
        return parseDatetime(dateStr, DatePatternEnum.DATE.getValue());
    }

    /**
     * 把日期字符串按照指定时间格式解析成Date实例
     *
     * @param dateStr 时间字符串
     * @param pattern 时间格式
     * @return 通过指定时间格式解析成的Date实例
     */
    public static Date parseDate(String dateStr, String pattern) {
        return DateUtil.date(LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern)));
    }

    /**
     * 把时间字符串按照指定格式解析成LocalDateTime实例
     *
     * @param dateStr 时间字符串
     * @param pattern 时间格式
     * @return 通过指定格式解析成的LocalDateTime实例
     */
    public static LocalDateTime parseLocalDateTime(String dateStr, String pattern) {
        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 把时间字符串按照默认格式解析成LocalDateTime实例
     *
     * @param dateStr 时间字符串
     * @return 通过默认格式解析成的LocalDateTime实例
     */
    public static LocalDateTime parseLocalDateTime(String dateStr) {
        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(DatePatternEnum.DATETIME.getValue()));
    }

    /**
     * 把日期字符串按照指定格式解析成LocalDate实例
     *
     * @param dateStr 日期字符串
     * @param pattern 日期格式
     * @return
     */
    public static LocalDate parseLocalDate(String dateStr, String pattern) {
        return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 把日期字符串按照指定格式解析成LocalDate实例
     *
     * @param dateStr 日期字符串
     * @return
     */
    public static LocalDate parseLocalDate(String dateStr) {
        return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(DatePatternEnum.DATE.getValue()));
    }

    /**
     * 把时间字符串按照指定格式解析成LocalTime实例
     *
     * @param timeStr 时间字符串
     * @param pattern 时间格式
     * @return
     */
    public static LocalDate parseLocalTime(String timeStr, String pattern) {
        return LocalDate.parse(timeStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 把时间字符串按照指定格式解析成LocalTime实例
     *
     * @param timeStr 时间字符串
     * @return
     */
    public static LocalDate parseLocalTime(String timeStr) {
        return LocalDate.parse(timeStr, DateTimeFormatter.ofPattern(DatePatternEnum.TIME.getValue()));
    }

    /**
     * 把时间字符串按照指定格式解析成Instant实例
     *
     * @param dateStr 时间字符串
     * @param pattern 时间格式
     * @return 通过指定格式解析成的Instant实例
     */
    public static Instant parseInstant(String dateStr, String pattern) {
        return DateUtil.instant(parseLocalDateTime(dateStr, pattern));
    }

    /**
     * 把时间字符串按照默认格式解析成Instant实例
     *
     * @param dateStr 时间字符串
     * @return 通过默认格式解析成的Instant实例
     */
    public static Instant parseInstant(String dateStr) {
        return DateUtil.instant(parseLocalDateTime(dateStr, DatePatternEnum.DATETIME.getValue()));
    }

}
